package cn.rulian.base.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;



/** 
 * 系统防盗版工具类（客户端版）
 */
public class Dm2
{
	private static String info; //本机版本信息（显示当前注册序列号的情况）
	
	/**
	 * 验证指定Key是否有效
	 */
	public boolean pass(String key)
	{
		if(xx.isEmpty(key))
		{
			info = "空序列号";
			return false;
		}
		if(key.length() != 42)
		{
			info = "非法序列号";
			return false;
		}
		
		key = this.jie(key);
		String sign = key.substring(20, 22); //标志：最中间2位
		String endStr = key.substring(16, 20) + key.substring(22, 26); //到期日：次两边各4位。
		String machineNum = key.substring(0, 16) + key.substring(26); //机器码：外两边各16位
		
		//验证标志位
		if(!"11".equals(sign) && !"00".equals(sign))
		{
			info = "非法序列号";
			return false;
		}
		
		//验证机器码
		if("00".equals(sign) && (!machineNum.equals(MD5Util.MD5("test"))))
		{
			info = "非法序列号";
			return false;
		}
		if("11".equals(sign) && (!machineNum.equals(this.getMachineNum())))
		{
			info = "无效正式序列号（非本机环境）";
			return false;
		}
		
		//显示信息
		String type ="正式序列号";
		if("00".equals(sign))
		{
			type = "测试序列号";
		}
		String endDate = null;
		
		
		//验证到期日
		try
		{
			SimpleDateFormat df = new SimpleDateFormat("MMyyyydd");
			Date end = df.parse(endStr);
			endDate = xx.getDateStr(end);
			if (end.before(new Date()))
			{
				info = type + "，有效期至：" + endDate +"，已过期！！！";
				return false;
			}
		} catch (ParseException e)
		{
			info = "非法序列号";
			return false;
		}

		info = type + "，有效期至：" + endDate ;
		return true;
	}

	/**
	 * 解密字符串
	 */
	private String jie(String s)
	{
		byte[] abyte0;
		char[] ac;
		int i;
		int k;
		int j;
		abyte0 = s.getBytes();
		ac = new char[s.length()];
		i = 0;
		k = abyte0.length;
		while (i < k)
		{
			j = abyte0[i];
			if ((j >= 48) && (j <= 57))
			{
				j = (((j - 48) + 6) % 10) + 48;
			} 
			else if ((j >= 65) && (j <= 90))
			{
				j = (((j - 65) + 16) % 26) + 65;
			} 
			else if ((j >= 97) && (j <= 122))
			{
				j = (((j - 97) + 16) % 26) + 97;
			}
			ac[i] = (char) j;
			i++;
		}
		return String.valueOf(ac);
	}
	
	/**
	 * 功能描述：得到机器码
	 */
	public String getMachineNum()
	{
		Properties pro = System.getProperties();
		StringBuilder str = new StringBuilder();
		str.append(pro.getProperty("user.dir"));
		str.append(pro.getProperty("os.name"));
		str.append(pro.getProperty("os.version"));
		str.append(pro.getProperty("java.home"));
		str.append(pro.getProperty("java.version"));
		
		return MD5Util.MD5(str.toString());
	}

	public static String getInfo()
	{
		return info;
	}

}
